package com.yifeng.service.impl;


import com.yifeng.common.Constants;
import com.yifeng.common.Result;
import com.yifeng.dao.UserDao;
import com.yifeng.model.LoginInfo;
import com.yifeng.model.User;
import com.yifeng.service.UserService;
import com.yifeng.factory.DAOFactory;
import com.yifeng.util.JwtUtil;

import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;

public class UserServiceImpl implements UserService {

    /*
    负责人：

    功能：通过 DAO 工厂获取 UserDao 实例，用于执行用户相关的数据库操作

    参数：无

    返回值:无
    */
    private final UserDao userDao = DAOFactory.getUserDao();

    /*
    负责人：

    功能：定义管理员注册所需的硬编码邀请码，当前值为 "ADMIN2025"，后续建议改为配置文件或数据库动态管理

    参数：无

    返回值:无
    */
    private static final String ADMIN_INVITE_CODE = "ADMIN2025";

    /*
    负责人：

    功能：实现用户登录验证逻辑，校验用户名和密码是否匹配，并返回用户信息

    参数：userName - 用户输入的用户名（允许前后空格）；password - 用户输入的原始密码（未加密）

    返回值:验证成功返回包含 User 对象的 Result.success；失败返回 Result.fail 并携带错误信息
    */
    @Override
    public Result login(String userName, String password) {
        try {
            password = DigestUtils.md5Hex(password);
            User user = userDao.findByUsernameAndPassword(userName, password);
            if (user != null) {
                Map<String,Object> map = new HashMap<>();
                map.put("id",user.getUserId());
                map.put("username",user.getUserName());
                map.put("role",user.getRole());
                String token = JwtUtil.generateToken(map);
                return Result.success(new LoginInfo(user.getUserId(), user.getUserName(), user.getRole(), token));
            }
        } catch (SQLException e) {
            return Result.fail("数据库异常");
        }
        return Result.fail("用户名或密码错误");
    }

    /*
    负责人：

    功能：实现用户注册逻辑，支持普通用户和管理员注册，管理员需验证邀请码

    参数：username - 注册用户名；password - 注册密码；role - 用户角色（"user" 或 "admin"）；inviteCode - 管理员邀请码（普通用户可为空）

    返回值:注册成功返回 Result.success；失败（如参数错误、用户名重复、邀请码错误等）返回 Result.fail 并说明原因
    */
    @Override
    public Result register(String username, String password, String role, String inviteCode) {

        try {
            if(userDao.existsByUsername(username)){
                return Result.fail("用户名已存在");
            }
            if(role.equals(Constants.ROLE_ADMIN)) {
                if (inviteCode == null || !inviteCode.equals(ADMIN_INVITE_CODE)) {
                    return Result.fail("邀请码错误");
                }
            }
            User user = new User();
            //对密码进行加密
            password = DigestUtils.md5Hex(password);
            user.setUserName(username);
            user.setPassword(password);
            user.setRole(role);
            user.setCreateTime(LocalDateTime.now());
            if(userDao.insert(user)){
                return Result.success(null);
            }else{
                return Result.fail("注册失败");
            }

        } catch (SQLException e) {
            return Result.fail("数据库异常");
        }
    }

    /*
    负责人：

    功能：分页查询所有用户列表，按创建时间倒序排列，并对分页参数做安全限制

    参数：pageNum - 请求页码（从1开始）；pageSize - 每页条数（限制在1~50之间，超出则使用默认值10）

    返回值:查询成功返回包含用户列表的 Result.success；异常时返回 Result.fail 并提示错误
    */
    @Override
    public Result getAllUsers() {
        List<User> users = null;
        try {
            users = userDao.findAll();
            return Result.success(users);
        } catch (SQLException e) {
            e.printStackTrace();
            return Result.fail("获取用户信息失败");
        }
    }

    /*
    负责人：

    功能：按用户角色分页查询用户列表，支持角色筛选（如 admin/user），并对参数做合法性校验

    参数：role - 要筛选的角色名称（非空）；pageNum - 页码（从1开始）；pageSize - 每页数量（1~50）

    返回值:筛选成功返回 Result.success 包含用户列表；失败返回 Result.fail 并说明原因
    */
    @Override
    public Result getUsersByRoleWithPagination(String role, int pageNum, int pageSize) {
        return null;
    }

    /*
    负责人：

    功能：根据用户ID删除指定用户，支持逻辑或物理删除（由DAO实现决定），并对ID做有效性校验

    参数：userId - 要删除的用户唯一标识（必须为正整数）

    返回值:删除成功返回 Result.success；用户不存在或删除失败返回 Result.fail 并提示原因
    */
    @Override
    public Result deleteUserById(Integer userId) {
        if (userId == null || userId <= 0) {
            return Result.fail("用户ID不存在");
        }

        boolean deleted = userDao.deleteById(userId);
        if (deleted) {
            return Result.success();
        } else {
            return Result.fail("删除失败或用户不存在");
        }
    }
}